from proyecto import Proyecto, db_session
from sqlalchemy import exc
from flask import flash
from fase import Fase
from rol import Rol
from usuario import Usuario
from comite import Comite
from solicitudCambio import SolicitudCambio

session = db_session()

class ProyectoManager(object):
    """Clase encargada del manejo de proyectos"""
    def __init__(self):
        pass
    def __repr__(self):
        return '<Proyecto Manager>'
    
    def guardarProyecto(self, proyecto):
        """
        Metodo encargado de almacenar un proyecto en la base de datos
        @param proyecto: Objeto proyecto que se desea guardar.
        """
        session.add(proyecto)
        try:
             session.commit()
        except exc.IntegrityError as ex:
             session.rollback()
             return flash("El proyecto ya existe", "error")
        else:
             return flash("Proyecto registrado exitosamente")
        session.close()
        
    def eliminarProyecto(self, idproyecto):
        """
        Metodo encargado de eliminar un proyecto de la base de datos
        @param idproyecto: id del proyecto que se desea eliminar.
        """
#        session = db_session()
        proyecto = session.query(Proyecto).filter(Proyecto.idproyecto == idproyecto).first()
        session.delete(proyecto)
        session.commit()
        
    def getProyecto(self, idproyecto):
        """
        Metodo encargado de retornar un proyecto de la base de datos
        @param idproyecto: id del proyecto que se desea obtener.
        """
        proyecto = session.query(Proyecto).filter(Proyecto.idproyecto == idproyecto).first()
        return proyecto
    
    def getProyectos(self):
        """Metodo encargado de retornar todos los proyectos de la base de datos"""
        proyectos = session.query(Proyecto)
        return proyectos
    
    def getProyectoFiltradoPorNombre(self, nombre):
        """
        Metodo encargado de retornar un proyecto dado su nombre
        @param nombre: nombre del proyecto que se desea obtener.
        """
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%" + nombre + "%"
        proyecto = session.query(Proyecto).filter(Proyecto.nombre.like(nombre)).order_by(Proyecto.nombre)
        return proyecto
     
#     def getProyectoPorUser(self, user):
#         proyecto = session.query(Proyecto).filter(Proyecto.proyecto==user).first()
#         return proyecto

    def getUsuariosDelProyecto(self, idproyecto):
         """
         Metodo encargado de retornar los usuarios de un proyecto
         @param idproyecto: id del proyecto cuyos usuarios se desean obtener.
         """
         usuarios = session.query(Usuario).join((Rol, Usuario.roles)).\
                    filter(Rol.idfase == Fase.idfase).\
                    filter(Fase.idproyecto == Proyecto.idproyecto).\
                    filter(Proyecto.idproyecto == idproyecto).distinct().order_by(Usuario.nombre).all()
         return usuarios
     
    def getRolesDelProyecto(self, idproyecto):
         """
         Metodo encargado de retornar todos los roles de un proyecto
         @param idproyecto: id del proyecto cuyos roles se desean obtener.
         """
         roles = session.query(Rol).filter(Rol.idfase == Fase.idfase).\
                    filter(Fase.idproyecto == Proyecto.idproyecto).\
                    filter(Proyecto.idproyecto == idproyecto).order_by(Rol.nombre).distinct()
         return roles
     
    def getComiteDelProyecto(self, idproyecto):
         """Metodo encargado de retornar el comite de un proyecto"""
         comite = session.query(Comite).filter(Comite.idproyecto == Proyecto.idproyecto).\
                    filter(Proyecto.idproyecto == idproyecto).first()
         return comite
     
    def getSolicitudesDelProyecto(self, idproyecto):
         """
         Metodo encargado de retornar el comite de un proyecto
         @param idproyecto: id del proyecto cuyas solicitudes de cambio se desean obtener.
         """
         comite = session.query(Comite).filter(Comite.idproyecto == Proyecto.idproyecto).\
                    filter(Proyecto.idproyecto == idproyecto).first()
         solicitudes = session.query(SolicitudCambio).filter(SolicitudCambio.idcomite == comite.idcomite).\
                    filter(Comite.idcomite == comite.idcomite)
         return solicitudes.all()
                    
    def getProyectosPaginado(self, nombre, desde, hasta):
        """
        Metodo encargado de retornar todos los proyectos del sistema paginados
        @param nombre: nombre del proyecto que se desea obtener.
        @param desde: indica inicio.
        @param hasta: indica fin.
        """
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%"+nombre+"%"

        if desde != None and hasta != None:
            proyectos = session.query(Proyecto).filter(Proyecto.nombre.like(nombre)).order_by(Proyecto.nombre)[desde:hasta]
            return proyectos
        else:
            total = session.query(Proyecto).filter(Proyecto.nombre.like(nombre)).count()
            return total

